﻿#define _CRT_SECURE_NO_WARNINGS

#include<assert.h>
#include<iostream>

using namespace std;

//类的定义
//类定义格式
//·class 为定义类的关键字，Stack为类的名字，{}中为类的主体，类定义结束后的分号不能省略
//·为了区分成员变量，一般习惯上成员变量会加一个特殊标识，如成员变量前面或后面加_ 或者 m 开头
//非强制，是为了提高代码的可阅读性
//·C++中struct 也可以定义类，C++ 兼容C 中struct 的用法，同时struct升级成了类，明显的变化是struct中可以定义函数
//一般情况推荐 class定义类
//·定义在类里面的成员函数默认为inline

//例子：
//class Stack
//{
//public:
//	//成员函数
//	void Init(int n = 4)
//	{
//		array = (int*)malloc(sizeof(int) * n);
//		if (nullptr == array)
//		{
//			perror("malloc申请空间失败");
//			return;
//		}
//		capacity = n;
//		top = 0;
//	}
//
//	void Push(int x)
//	{
//		//扩容
//		array[top++] = x;
//	}
//
//	void Destroy()
//	{
//		free(array);
//		array = nullptr;
//		top = capacity = 0;
//	}
//
//	int Top()
//	{
//		assert(top > 0);
//		return array[top - 1];
//	}
//private:
//	//成员变量
//	int* array;
//	size_t capacity;
//	size_t top;
//};
//
////类命就是类型
//int main()
//{
//	Stack st1;
//	//初始化
//	st1.Init();
//	st1.Push(1);
//	st1.Push(2);
//	st1.Push(3);
//	st1.Push(4);
//
//	cout << st1.Top() << endl;
//
//	st1.Destroy();
//
//	return 0;
//}

//访问限定符
//·C++⼀种实现封装的⽅式，⽤类将对象的属性与⽅法结合在⼀块，让对象更加完善通过访问权限选择性的将其接⼝提供给外部的⽤⼾使⽤。
//·public修饰的成员在类外可以直接被访问；protected和private修饰的成员在类外不能直接被访问，protected和private是⼀样的
//·访问权限作⽤域从该访问限定符出现的位置开始直到下⼀个访问限定符出现时为⽌，如果后⾯没有访问限定符，作⽤域就到 }即类结束。
//·class定义成员没有被访问限定符修饰时默认为private，struct默认为public。
//⼀般成员变量都会被限制为private/protected，需要给别⼈使⽤的成员函数会放为public。

//类域
//类定义了⼀个新的作⽤域，类的所有成员都在类的作⽤域中，在类体外定义成员时，需要使⽤ :: 作⽤域操作符指明成员属于哪个类域。
//类域影响的是编译的查找规则，下⾯程序中Init如果不指定类域Stack，那么编译器就把Init当成全
//局函数，那么编译时，找不到array等成员的声明 / 定义在哪⾥，就会报错。指定类域Stack，就是知
//道Init是成员函数，当前域找不到的array等成员，就会到类域中去查找。

//例子：
//class Stack
//{
//public:
//	// 成员函数
//	void Init(int n = 4);
//private:
//	// 成员变量
//	int* array;
//	size_t capacity;
//	size_t top;
//};
//
//// 声明和定义分离，需要指定类域
//void Stack::Init(int n)
//{
//	array = (int*)malloc(sizeof(int) * n);
//	if (nullptr == array)
//	{
//		perror("malloc申请空间失败");
//		return;
//	}
//	capacity = n;
//	top = 0;
//}
//
//int main()
//{
//	Stack st;
//	st.Init();
//	return 0;
//}
//
